/*
 * Created by SharpDevelop.
 * user: Robertux
 * Date: 20/03/2008
 * Time: 18:51
 * 
 * 
 */

using System;
using System.Drawing;
using System.Windows.Forms;
using DataLayer;
using Inventador;
using System.Collections.Generic;
using ZedGraph;

namespace WinApp
{
	/// <summary>
	/// Description of frmDetallesProducto.
	/// </summary>
	public partial class frmDetallesProducto : Form
	{
		private BaseDatos bdatos;
		private List<Producto> prods;
		private List<Movimiento> movs;
		private DataGridViewCellStyle estiloEntrada;
		private DataGridViewCellStyle estiloSalida;
		private int invIni = 0, totEntradas = 0, totSalidas = 0;
		
		public frmDetallesProducto()
		{
			InitializeComponent();
		}
		
		public frmDetallesProducto(BaseDatos bdatosExterna, Producto prd): this()
		{
			this.estiloEntrada = new DataGridViewCellStyle();
			this.estiloSalida = new DataGridViewCellStyle();
			this.estiloEntrada.ForeColor = Color.Green;
			this.estiloSalida.ForeColor = Color.DarkRed;
			this.bdatos = bdatosExterna;
			this.prods = Producto.GetList(this.bdatos, "id != 0");
			this.RellenarComboProductos();
			if(prd != null)
			{
				for(int i = 0; i<this.prods.Count; i++)
				{
					if(prd.Id == this.prods[i].Id)
					{
						this.comboBox3.SelectedIndex = i;
						break;
					}					
				}				
			}
			else
				this.comboBox3.SelectedIndex = 0;
			this.comboBox3.SelectedIndexChanged += new System.EventHandler(this.ComboBox3SelectedIndexChanged);
			this.movs = Movimiento.GetListByProducto(this.bdatos, this.prods[this.comboBox3.SelectedIndex].Id, "Fecha");
			this.RellenarGrid();
			this.RellenarCombosFecha();
			this.Text = "Movimientos del Producto " + this.prods[this.comboBox3.SelectedIndex].fkTipoProducto.Nombre + " " + this.prods[this.comboBox3.SelectedIndex].fkMarcaProducto.Nombre;
			this.InicializarGrafico();
			this.comboBox4.SelectedIndex = 0;
		}
		
		public void RellenarGrid()
		{
			this.grdMovimientos.Rows.Clear();
			foreach(Movimiento mov in this.movs)
			{
				this.grdMovimientos.Rows.Add(new object[]{mov.Id, mov.Fecha.ToShortDateString(), mov.TipoMovimiento, mov.Cantidad});
					foreach(DataGridViewCell celda in this.grdMovimientos.Rows[this.grdMovimientos.Rows.Count - 1].Cells)
						celda.Style = (mov.TipoMovimiento == "Entrada"?  this.estiloEntrada: this.estiloSalida);
			}
		}
		
		public void RellenarCombosFecha()
		{
			if(this.movs.Count > 0)
			{
				this.comboBox1.SelectedIndexChanged -= new System.EventHandler(this.ComboBox1SelectedIndexChanged);
				this.comboBox2.SelectedIndexChanged -= new System.EventHandler(this.ComboBox2SelectedIndexChanged);
				this.comboBox1.Enabled = true;
				this.comboBox2.Enabled = true;
				int minYear = this.movs[0].Fecha.Year;
				this.comboBox2.Items.Clear();
				for(int i = minYear; i <= DateTime.Now.Year; i++)
					this.comboBox2.Items.Add(i.ToString());
				this.comboBox2.SelectedIndex = this.comboBox2.Items.Count - 1;
				this.comboBox1.SelectedIndex = DateTime.Now.Month - 1;
				this.comboBox1.SelectedIndexChanged += new System.EventHandler(this.ComboBox1SelectedIndexChanged);
				this.comboBox2.SelectedIndexChanged += new System.EventHandler(this.ComboBox2SelectedIndexChanged);
				this.FiltrarMovsPorFecha();
				this.ActualizarDetalles();
				this.ActualizarValoresGrafico();
			}
			else
			{
				this.comboBox1.Enabled = false;
				this.comboBox2.Enabled = false;
			}
		}
		
		public void RellenarComboProductos()
		{
			this.comboBox3.Items.Clear();
			foreach(Producto prd in this.prods)
				this.comboBox3.Items.Add(prd.fkTipoProducto.Nombre + " " + prd.fkMarcaProducto.Nombre);
		}		
		
		public void FiltrarMovsPorFecha()
		{
			if(this.movs.Count > 0)
			{
				for(int i = 0; i<this.movs.Count; i++)
				{
					if((this.movs[i].Fecha.Year.ToString() == this.comboBox2.Text) && (this.movs[i].Fecha.Month == (this.comboBox1.SelectedIndex + 1)))
						this.grdMovimientos.Rows[i].Visible = true;
					else
						this.grdMovimientos.Rows[i].Visible = false;
				}
			}
		}
		
		public void ActualizarDetalles()
		{
			this.invIni = 0;
			this.totEntradas = 0;
			this.totSalidas = 0;
			foreach(Movimiento mov in this.movs)
			{
				int anyo = int.Parse(this.comboBox2.Text);
				int mes = this.comboBox1.SelectedIndex + 1;
				DateTime selectedDate = new DateTime(anyo, mes, 1);
				if(mov.Fecha < selectedDate)
				{
					if(mov.TipoMovimiento == "Entrada")
						this.invIni += mov.Cantidad;
					else
						this.invIni -= mov.Cantidad;
				}
				else
				{
					if(mov.Fecha.Year == selectedDate.Year && mov.Fecha.Month == selectedDate.Month)
					{
						if(mov.TipoMovimiento == "Entrada")
							this.totEntradas += mov.Cantidad;
						else
							this.totSalidas += mov.Cantidad;
					}
				}
//				if(mov.Fecha.Year <= DateTime.Now.Year && mov.Fecha.Month <= DateTime.Now.Month)
//				{
//					if((mov.Fecha.Year.ToString() == this.comboBox2.Text) && (mov.Fecha.Month == (this.comboBox1.SelectedIndex + 1)))
//					{
//						if(mov.TipoMovimiento == "Entrada")
//							this.totEntradas += mov.Cantidad;
//						else
//							this.totSalidas += mov.Cantidad;
//					}
//					else
//					{
//						if(mov.TipoMovimiento == "Entrada")
//							this.invIni += mov.Cantidad;
//						else
//							this.invIni -= mov.Cantidad;
//					}
//				}
			}
			this.lblInvInicial.Text = "Inventario Inicial: " + this.invIni.ToString();
			this.lblTotEntradas.Text = "Total Entradas: " + this.totEntradas.ToString();
			this.lblTotSalidas.Text = "Total Salidas(Consumo): " + this.totSalidas.ToString();
			this.lblConsumo.Text = "Final: " + (this.invIni + (this.totEntradas - this.totSalidas)).ToString();
		}
		
		public void InicializarGrafico()
		{
			GraphPane grafico = this.zedGraphControl1.GraphPane;
			grafico.Title.Text = "Movimientos Diarios";
			grafico.XAxis.Title.Text = "Dias";
			grafico.YAxis.Title.Text = "Unidades";			
		}
		
		public void ActualizarValoresGrafico()
		{
			GraphPane grafico = this.zedGraphControl1.GraphPane;
			grafico.CurveList.Clear();
			grafico.GraphObjList.Clear();
			this.zedGraphControl1.Update();			
			PointPairList pplEntradas = new PointPairList();
			if(this.movs.Count > 0)
			{
				PointPair pPair = new PointPair(1d, (double)this.invIni);
				for(int i = 0; i<this.movs.Count; i++)
				{
					if((this.movs[i].Fecha.Year.ToString() == this.comboBox2.Text) && (this.movs[i].Fecha.Month == (this.comboBox1.SelectedIndex + 1)))
					{
						if(this.movs[i].Fecha.Day == int.Parse(pPair.X.ToString()))
						{
							if(this.movs[i].TipoMovimiento == "Entrada")
								pPair.Y += this.movs[i].Cantidad;
							else
								pPair.Y -= this.movs[i].Cantidad;
						}
						else
						{
							pplEntradas.Add(pPair);
							if(this.movs[i].TipoMovimiento == "Entrada")
								pPair = new PointPair((double)this.movs[i].Fecha.Day, pPair.Y + (double)this.movs[i].Cantidad);
							else
								pPair = new PointPair((double)this.movs[i].Fecha.Day, pPair.Y - (double)this.movs[i].Cantidad);
						}					
					}
				}				
				pplEntradas.Add(pPair);
				pplEntradas.Add(new PointPair(DateTime.DaysInMonth(int.Parse(this.comboBox2.Text), this.comboBox1.SelectedIndex + 1), pPair.Y));
			}			
			grafico.Legend.IsVisible = false;
			
			grafico.XAxis.Scale.MinAuto = false;
			grafico.XAxis.Scale.MaxAuto = false;
			grafico.XAxis.Scale.Min = 1;
			grafico.XAxis.Scale.Max = DateTime.DaysInMonth(int.Parse(this.comboBox2.Text), this.comboBox1.SelectedIndex + 1);
			grafico.YAxis.Scale.Min = 0;
			
			LineItem curva = grafico.AddCurve("Cantidad", pplEntradas,Color.Green);
			curva.Line.Fill = new Fill(Color.LightGreen, Color.Green, 270F);
			curva.Line.StepType = StepType.ForwardStep;
			for(int i = 0; i<curva.Points.Count; i++)
			{
				TextObj texto = new TextObj(curva.Points[i].Y.ToString(), curva.Points[i].X, curva.Points[i].Y + 5, CoordType.AxisXYScale, AlignH.Left, AlignV.Center);
				texto.ZOrder = ZOrder.A_InFront;
				texto.FontSpec.Border.IsVisible = false;
				texto.FontSpec.Fill.IsVisible = false;
				grafico.GraphObjList.Add(texto);
			}
			BoxObj fondoCantMinima = new BoxObj(0, (double)this.prods[this.comboBox3.SelectedIndex].ExistenciaMinima, 1, (double)this.prods[this.comboBox3.SelectedIndex].ExistenciaMinima, Color.Red,Color.FromArgb(20,Color.Red));
			fondoCantMinima.Fill = new Fill(Color.FromArgb(50, Color.Red), Color.FromArgb(0, Color.Red), 90F);
			fondoCantMinima.ZOrder = ZOrder.A_InFront;
			fondoCantMinima.IsClippedToChartRect = true;
			fondoCantMinima.Location.CoordinateFrame = CoordType.XChartFractionYScale;
			TextObj etiqueta = new TextObj("Existencia Minima: " + this.prods[this.comboBox3.SelectedIndex].ExistenciaMinima.ToString(), 0.01, this.prods[this.comboBox3.SelectedIndex].ExistenciaMinima + 2, CoordType.XChartFractionYScale, AlignH.Left, AlignV.Center);
			etiqueta.ZOrder = ZOrder.A_InFront;
			etiqueta.FontSpec.Fill.IsVisible = false;
			etiqueta.FontSpec.Border.IsVisible = false;
			etiqueta.FontSpec.FontColor = Color.DarkRed;;
			grafico.GraphObjList.Add(etiqueta);
			grafico.GraphObjList.Add(fondoCantMinima);
			this.zedGraphControl1.AxisChange();
			this.zedGraphControl1.Update();
			this.Refresh();
		}
		
		void Button1Click(object sender, EventArgs e)
		{
			this.Close();
		}
		
		void ComboBox1SelectedIndexChanged(object sender, EventArgs e)
		{
			this.FiltrarMovsPorFecha();
			this.ActualizarDetalles();
			this.ActualizarValoresGrafico();
		}
		
		void ComboBox2SelectedIndexChanged(object sender, EventArgs e)
		{
			this.FiltrarMovsPorFecha();
			this.ActualizarDetalles();
			this.ActualizarValoresGrafico();
		}
		
		void ComboBox3SelectedIndexChanged(object sender, EventArgs e)
		{
			this.movs = Movimiento.GetListByProducto(this.bdatos, this.prods[this.comboBox3.SelectedIndex].Id, "Fecha");
			this.RellenarGrid();			
			RellenarCombosFecha();
			this.FiltrarMovsPorFecha();
			this.ActualizarDetalles();
			this.ActualizarValoresGrafico();
		}
		
		void Button2Click(object sender, EventArgs e)
		{
			int maxId = Movimiento.GetMaxId(this.bdatos);
			Movimiento nuevoMov = new Movimiento(maxId + 1, this.comboBox4.Text, this.prods[this.comboBox3.SelectedIndex], int.Parse(this.numericUpDown1.Value.ToString()), DateTime.Now);
			nuevoMov.Insert(this.bdatos);
			this.movs = Movimiento.GetListByProducto(this.bdatos, this.prods[this.comboBox3.SelectedIndex].Id, "Fecha");
			this.RellenarGrid();			
			this.FiltrarMovsPorFecha();
			this.ActualizarDetalles();
			this.ActualizarValoresGrafico();
		}
	}
}

//TODO: agregar existencia ideal como nuevo campo en los productos (yo)
//TODO: quitar el panning (yo)
//TODO: totalizar movimientos para los dias(agregar una fila en el grid para mostrarla y si es posible, sincronizar con el grafico) (yo)
//TODO: hacer autocompletable el combo de seleccion de productos en el formulario de Detalles del producto
//TODO: acutalizar el titulo de la ventana de Detalles del producto cuando se seleccione un nuevo producto en el comboBox (yo)
//TODO: hacer un formulario que muestre los summary de cada producto (inicial, entardas, salidas, final) en un grid listado para cada produto (Idem de la hoja de excel)
//TODO: hacer los combos de tipos y marcas en el formulario de agregar nuevo producto autocompletables.
//TODO: permitir agregar nuevos productos y marcas desde su respectivo comboBox en el formulario de agregar nuevo producto mostrando una ultima opcion en el combo que sirva para tal fin
//TODO: agregar ErrorProvider para validar el autocompletado en los combos antes mencionados
//TODO: 
